package scripts;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import launcher.Script;

import common.ErrorManager;
import common.FileUtil;
import common.PropertiesManager;

public class Creador extends Script {

	private JFrame gui = null;

	public Creador() {
		super("Creador de incidencias", null, null);
	}

	public void exec() {
		gui = new CreadorGUI(this);
	}

	public void generaIncidencia(String paquete, String id, String nombre) {
		String nombreCompleto = ((id ==null) || (id.equals("")))?nombre:id + " - " + nombre;
		
		File dirPaquete = new File(PropertiesManager.getProperty("Local", "PackagesDirectory"), paquete);
		if (!dirPaquete.exists())
			salir(ErrorManager.NO_PACKAGE);
		if (!dirPaquete.canRead())
			salir(ErrorManager.PACKAGE_DIR_READ_ERROR);
		if (!dirPaquete.canWrite())
			salir(ErrorManager.PACKAGE_DIR_WRITE_ERROR);
		if (!dirPaquete.isDirectory())
			salir(ErrorManager.PACKAGE_NOT_DIRECTORY);
		if (yaExiste(dirPaquete, nombreCompleto))
			salir(ErrorManager.CR_ALREADY_EXISTS);

		File dirPlantilla = new File(PropertiesManager.getProperty("Local", "PathPlantilla"));
		if (!dirPlantilla.exists())
			salir(ErrorManager.TEMPLATE_NOT_ACCESIBLE);
		if (!dirPlantilla.canRead())
			salir(ErrorManager.TEMPLATE_NOT_READABLE);

		// Copiar plantilla al directorio de incidencias
		String newDirPath = dirPaquete.getAbsolutePath() + "\\" + nombreCompleto;
		try {
			FileUtil.copyDirectory(dirPlantilla, new File(newDirPath));
		} catch (IOException e) {
			salir(ErrorManager.NEW_DIR_CREATE_ERROR);
		}

		// Cambiar el nombre del proyecto
		File proyectFile = new File(newDirPath + "//Proyecto.prj");
		proyectFile.renameTo(new File(newDirPath + "//" + nombreCompleto + ".prj"));

		// Preparar el fichero de descripcion
		try {
			File descFile = new File(newDirPath + "//5. Documentacion//Descripcion CD PVCS.txt");
			String texto = FileUtil.readFile(descFile);
			if((id ==null) || (id.equals("")))
				FileUtil.writeFile(descFile, texto.replaceAll("idSalesforce - ", "").replaceAll("-------------------------------------------------------------------------------\nChangeDocument para resolver la incidencia con Id de Salesforce: idSalesforce\n", "").replaceAll("TITULO EN MAYUSCULAS", nombre.toUpperCase()));
			else
				FileUtil.writeFile(descFile, texto.replaceAll("idSalesforce", id).replaceAll("TITULO EN MAYUSCULAS", nombre.toUpperCase()));
		} catch (IOException e) {
			salir(ErrorManager.DESC_FILE_EDIT_ERROR);
		}

		if((id ==null) || (id.equals("")))
			id = nombre;
		
		// Cambiar los nombres de los ficheros de documentacion
		File instBuyerFile = new File(newDirPath + "//5. Documentacion//SRuiz Guia Instalacion Buyer idSalesforce.doc");
		instBuyerFile.renameTo(new File(newDirPath + "//5. Documentacion//SRuiz Guia Instalacion Buyer " + id + ".doc"));

		File instUpstreamFile = new File(newDirPath + "//5. Documentacion//SRuiz Guia Instalacion Upstream idSalesforce.doc");
		instUpstreamFile.renameTo(new File(newDirPath + "//5. Documentacion//SRuiz Guia Instalacion Upstream " + id + ".doc"));

		File resumenFile = new File(newDirPath + "//5. Documentacion//SRuiz idSalesforce Titulo.ppt");
		resumenFile.renameTo(new File(newDirPath + "//5. Documentacion//SRuiz " + nombreCompleto + ".ppt"));

		salir(ErrorManager.ALL_OK);
	}

	private boolean yaExiste(File dir, String titulo) {
		String[] files = dir.list();
		for (int i = 0, s = files.length; i < s; i++) {
			if (titulo.equals(files[i]))
				return true;
		}
		return false;
	}

	private void salir(int errno) {
		if (errno > 0) {
			JOptionPane.showMessageDialog(gui, ErrorManager.getErrorMessage(errno));
		}
		System.exit(-errno);
	}
}

class CreadorGUI extends JFrame {
	
	private static final long serialVersionUID = 6317995643181353849L;
	
	private JComboBox comboPaquete = null;
	private JTextField textIdent = null;
	private JTextField textNombre = null;
	
	public CreadorGUI ( Creador creador){
		super();
		init(creador);		
	}
	
	private void init(final Creador creador){
		String packages = PropertiesManager.getProperty("Local", "Packages");
		String [] splittedPackages = packages.split(",");
		for(int i=0, s=splittedPackages.length;i<s;i++)
			splittedPackages[i] = splittedPackages[i].trim();
		
		comboPaquete = new JComboBox(splittedPackages);
		
		textIdent = new JTextField();
		
		textNombre = new JTextField();
		
		JPanel datos = new JPanel();
		datos.setBorder(BorderFactory.createTitledBorder("Datos de la incidencia"));
		datos.setLayout(new GridLayout(3,2));
		datos.add(new JLabel("Paquete:"));
		datos.add(comboPaquete);
		datos.add(new JLabel("Id. Salesforce:"));
		datos.add(textIdent);
		datos.add(new JLabel("Nombre:"));
		datos.add(textNombre);

		JButton sinc = new JButton("Crear");
		sinc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				creador.generaIncidencia((String)comboPaquete.getSelectedItem(), textIdent.getText(), textNombre.getText());
			}
		});

		JButton canc = new JButton("Cancelar");
		canc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		JPanel botones = new JPanel();
		botones.setLayout(new FlowLayout());
		botones.getInsets().set(5, 5, 5, 5);
		botones.add(sinc);
		botones.add(canc);

		JPanel jContentPane = new JPanel();
		jContentPane.setLayout(new BorderLayout());
		jContentPane.add(datos, BorderLayout.CENTER);
		jContentPane.add(botones, BorderLayout.SOUTH);

		this.setSize(new Dimension(400, 150));
		this.setContentPane(jContentPane);
		this.setTitle("Sincronizador");
		this.centrarPantalla();
		this.setVisible(true);
	}
	
	private void centrarPantalla() {
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation((dim.width - getSize().width) / 2, (dim.height - getSize().height) / 2);
	}
}
